package com.qianfeng.project.web;


//
//                            _ooOoo_  
//                           o8888888o  
//                           88" . "88  
//                           (| -_- |)  
//                            O\ = /O  
//                        ____/`---'\____  
//                      .   ' \\| |// `.  
//                       / \\||| : |||// \  
//                     / _||||| -:- |||||- \  
//                       | | \\\ - /// | |  
//                     | \_| ''\---/'' | |  
//                      \ .-\__ `-` ___/-. /  
//                   ___`. .' /--.--\ `. . __  
//                ."" '< `.___\_<|>_/___.' >'"".  
//               | | : `- \`.;`\ _ /`;.`/ - ` : | |  
//                 \ \ `-. \_ __\ /__ _/ .-` / /  
//         ======`-.____`-.___\_____/___.-`____.-'======  
//                            `=---='  
//  
//         .............................................  
//                  佛祖镇楼            BUG辟易  
//          佛曰:  
//                  写字楼里写字间，写字间里程序员；  
//                  程序人员写程序，又拿程序换酒钱。  
//                  酒醒只在网上坐，酒醉还来网下眠；  
//                  酒醉酒醒日复日，网上网下年复年。  
//                  但愿老死电脑间，不愿鞠躬老板前；  
//                  奔驰宝马贵者趣，公交自行程序员。  
//                  别人笑我忒疯癫，我笑自己命太贱；  


import com.alibaba.druid.util.StringUtils;
import com.qianfeng.project.pojo.PageData;
import com.qianfeng.project.pojo.Student;
import com.qianfeng.project.service.StudentService;
import com.qianfeng.project.service.impl.StudentServiceImpl;
import com.qianfeng.project.utils.BeanUtils;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * Created by jackiechan on 2021/9/2 11:05
 * 当前的 servlet 是添加学生数据用的
 *
 * @author jackiechan
 * @version 1.0
 * @since 1.0
 */
@WebServlet("/studentoperater")
public class StudentServlet extends HttpServlet {

    private StudentService studentService = new StudentServiceImpl();


    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //我们要求用户必须传递 option 参数来告诉我们他想干什么
        String option = req.getParameter("option");
        switch (option) {
            case "add":
                //添加
                addStudents(req, resp);
                break;

            case "update":
                //更新
                update(req, resp);
                break;
            case "updatepage":
                updatePage(req, resp);
                break;
            case "delete":
                deleteById(req, resp);
                break;

            case "querylist"://查询列表(分页)
                queryList(req, resp);
                break;
            case "queryid"://查询单个数据

                break;
        }


    }

    /**
     * 更新方法
     * @param req
     * @param resp
     */
    private void update(HttpServletRequest req, HttpServletResponse resp) {
        //首先获取参数,参数可以通过反射来封装

        try {
            Student student = BeanUtils.processParamters(req, Student.class);
            studentService.updateStuById(student);
            //重新回到列表页面刷新一下页面
            resp.sendRedirect("./studentoperater?option=querylist");
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    private void updatePage(HttpServletRequest req, HttpServletResponse resp) {
        //跳转到更新页面,需要携带数据过去,数据是什么,当前要更新的学的是数据,要更新的学生是谁?需要传递学的 id 过来
        //1 先获取学生的 id.我们要求通过 stuId 这个参数传递
        String stuId = req.getParameter("stuId");

        //根据学生 id 查询学生信息
        if (StringUtils.isEmpty(stuId)) {
            try {
                resp.getWriter().write("没有传递学生 id,无法删除");
            } catch (IOException e) {
                e.printStackTrace();
            }
            return;
        }

        try {
            long id = Long.parseLong(stuId);
            //通过业务查询学生信息
            //查询到了之后跳转到编辑页面,跳转之前需要保存数据到 req
            Student student = studentService.findStuById(id);
            req.setAttribute("stu", student);
            //跳转到更新页面
            req.getRequestDispatcher("/student/updatestudent.jsp").forward(req,resp);
        } catch (Exception e) {
            try {
                resp.getWriter().write("传递的学生 id 不是合法 id");
            } catch (IOException ex) {
                ex.printStackTrace();
            }
            e.printStackTrace();
        }


    }

    private void deleteById(HttpServletRequest req, HttpServletResponse resp) {
        String stuId = req.getParameter("stuId");//必须传递的学生 id

        if (StringUtils.isEmpty(stuId)) {
            try {
                resp.getWriter().write("没有传递学生 id,无法删除");
            } catch (IOException e) {
                e.printStackTrace();
            }
            return;
        }

        try {
            long id = Long.parseLong(stuId);
            studentService.deleteStudentById(id);
            //重新回到列表页面刷新一下页面
            resp.sendRedirect("./studentoperater?option=querylist");
        } catch (Exception e) {
            try {
                resp.getWriter().write("传递的学生 id 不是合法 id");
            } catch (IOException ex) {
                ex.printStackTrace();
            }
            e.printStackTrace();
        }

    }

    /**
     * 查询分页数据
     *
     * @param req
     * @param resp
     */
    private void queryList(HttpServletRequest req, HttpServletResponse resp) {
        //查询分页数据,需要告诉我当前是第几页,每页显示多少条

        String pageNum = req.getParameter("pageNum");//第几页
        String pageSize = req.getParameter("pageSize");//期望每页显示多少条
        //上面这两个参数用户有可能没传,甚至故意传错的,我们需要先对字符串转数据,转换失败的话使用默认值

        int num = 1;
        int size = 5;

        //通过捕获异常直接转数据,这样即便是不传,也没事,也可以通过判断做操作

        if (!StringUtils.isEmpty(pageNum)) {
            try {
                num = Integer.parseInt(pageNum);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        if (!StringUtils.isEmpty(pageSize)) {
            try {
                size = Integer.parseInt(pageSize);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }


        PageData<Student> pageData = studentService.findStudentsByPage(num, size);//我们要显示的数据
        //有了数据之后是不是要显示数据,需要先确定在什么页面显示
        req.setAttribute("pagedata", pageData);
        try {
            req.getRequestDispatcher("/student/studentslist.jsp").forward(req, resp);
        } catch (ServletException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }


    }


    private void addStudents(HttpServletRequest req, HttpServletResponse resp) {
        //添加学生数据需要学生信息
        //数据用户传过来的
        //我们需要考虑 用户应该传什么
        //有什么是必须传递的, 学生的姓名,性别,班号,电话,地址,生日,邮箱(可选,可选就以为用户可能会传递,那既然可能会传递,我们就认为会传递,所以这个参数也一定会获取的,只不过可能是 null 最后插入到库是 null)
        //定义参数名,谁然我们是服务端,我们说的算,我要求你传递什么参数名就是什么参数名
        // 学生名字: stuName, 性别: stuGender,电话:stuPhone,生日:bornDate,邮箱:stuEmail,地址:stuAddress,班号:gradeId
//        String stuName = req.getParameter("stuName");
//        String stuGender = req.getParameter("stuGender");
//        String stuPhone = req.getParameter("stuPhone");
//        String bornDate = req.getParameter("bornDate");//日期传过来是字符串
//        String stuEmail = req.getParameter("stuEmail");
//        String stuAddress = req.getParameter("stuAddress");
//        String gradeId = req.getParameter("gradeId");
//        //上面参数需要向下传递,最终进入数据库, 但是参数的个数太多,会导致方法的形参太多,所以需要封装
//        Student student = new Student();
//        student.setStuAddress(stuAddress);
//        student.setBornDate(bornDate);//我们需要一个日期对象,所以需要转换,但是日期是有格式的,所以我们需要定义格式
//        student.setStuEmail(stuEmail);
//        student.setStuGender(stuGender);
//        student.setStuPhone(stuPhone);
//        student.setStuName(stuName);
//        student.setGradeId(gradeId);//是个数字,所以转成数字即可

        try {
            Student student = BeanUtils.processParamters(req, Student.class);
            System.err.println("student====>" + student);
            studentService.addStudent(student);
            resp.getWriter().write("成功");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
